﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.Interfaces.Repositorios;
using LM.Negocio.Objetos;

namespace LM.Negocio.Validadores
{
    public class ValidadorDeDependente : ValidadorAbastrato
    {
        private Dependente _objetoValidado;

        private IRepositorioDeConsultaDeObjetos<Dependente> _repositorioDeDependente;

        public ValidadorDeDependente(IRepositorioDeConsultaDeObjetos<Dependente> repositorioDeDependente)
        {
            if (repositorioDeDependente == null)
            {
                throw new ArgumentNullException("repositorioDeDependente");
            }

            _repositorioDeDependente = repositorioDeDependente;
        }

        public ValidadorDeDependente() {}

        public void ValideCadastro(Dependente Dependente)
        {
            if (Dependente == null)
            {
                throw new ArgumentException("Dependente");
            }

            _objetoValidado = Dependente;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNomeNaoInformado();
            ValideCpfNaoInformado();
            ValideCnhNaoInformado();
            ValideDependenteJaCadastrada();

            base.GarantaSucesso();
        }

        public void ValideDependenteLista(Dependente Dependente)
        {
            if (Dependente == null)
            {
                throw new ArgumentException("Dependente");
            }

            _objetoValidado = Dependente;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNomeNaoInformado();
            ValideCpfNaoInformado();
            ValideCnhNaoInformado();

            base.GarantaSucesso();
        }

        public void ValideAtualizacao(Dependente Dependente)
        {
            if (Dependente == null)
            {
                throw new ArgumentException("Dependente");
            }

            _objetoValidado = Dependente;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNomeNaoInformado();
            ValideCpfNaoInformado();
            ValideCnhNaoInformado();
            ValideDependenteNaoCadastrada();

            base.GarantaSucesso();
        }

        public void ValideExclusao(Dependente Dependente)
        {
            if (Dependente == null)
            {
                throw new ArgumentException("Dependente");
            }

            _objetoValidado = Dependente;
            base.LimpeInconsistencias();

            ValideDependenteNaoCadastrada();

            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if (_objetoValidado.Codigo == 0)
            {
                AdicioneInconsistencia("Código não informado.");
            }
        }

        private void ValideNomeNaoInformado()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.Nome))
            {
                AdicioneInconsistencia("Nome não informado.");
            }
        }

        private void ValideCpfNaoInformado()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.Cpf))
            {
                AdicioneInconsistencia("Cpf não informado.");
            }
        }

        private void ValideCnhNaoInformado()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.Cnh))
            {
                AdicioneInconsistencia("Cnh não informado.");
            }
        }

        private bool DependenteJaCadastrada()
        {
            return _repositorioDeDependente.Consulte(m => m.Codigo == _objetoValidado.Codigo).Any();
        }

        private void ValideDependenteJaCadastrada()
        {
            if (DependenteJaCadastrada())
            {
                AdicioneInconsistencia("Já existe uma Dependente cadastrado com o código {0}.", _objetoValidado.Codigo);
            }
        }

        private void ValideDependenteNaoCadastrada()
        {
            if (!DependenteJaCadastrada())
            {
                AdicioneInconsistencia("Dependente com o código {0} não cadastrado.", _objetoValidado.Codigo);
            }
        }
    }
}
